<template>
  <a-table rowKey="id" size="middle" bordered :loading="loading" :columns="columns" :dataSource="tableDataWithTotal"
           :pagination="false">

    <template slot="htmlSlot" slot-scope="text">
      <div v-html="text"></div>
    </template>

    <template slot="imgSlot" slot-scope="text,record">
      <div style="font-size: 12px;font-style: italic;">
        <span v-if="!text">无图片</span>
        <img v-else :src="getImgView(text)" :preview="record.id" alt="" style="max-width:80px;height:25px;" />
      </div>
    </template>

    <template slot="fileSlot" slot-scope="text">
      <span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span>
      <a-button v-else ghost type="primary" icon="download" size="small" @click="downloadFile(text)">
        <span>下载</span>
      </a-button>
    </template>

  </a-table>
</template>

<script>
import { getAction } from '@api/manage'
import { JeecgListMixin } from '@/mixins/JeecgListMixin'

export default {
  name: 'CwJbsrysSubTable',
  mixins: [JeecgListMixin],
  props: {
    record: {
      type: Object,
      default: null,
    }
  },
  data() {
    return {
      description: '基本收入预算明细表内嵌列表',
      disableMixinCreated: true,
      loading: false,
      dataSource: [],
      currentYear: '', // 存储当前主表年度
      nextYear: '', // 存储次年（当前年度+1）
      // 分项合计：在职+离退休
      personTargetProjects: [' 在职', ' 离退休'],
      // 总合计：在职+离退休+日常公用经费
      totalTargetProjects: [' 在职', ' 离退休', ' 日常公用经费'],
      // 专业业务活动收入：技术服务类收入+其他专业业务活动收入
      serviceBizTargetProjects: [' 技术服务类收入', ' 其他专业业务活动收入'],
      // 辅助活动收入：科技副产品收入+其他辅助活动收入
      assistBizTargetProjects: [' 科技副产品收入', ' 其他辅助活动收入'],
      // 全业务收入合计（5个指定项目）
      allBizTargetProjects: [
        ' 其他业务收入',
        ' 其他辅助活动收入',
        ' 科技副产品收入',
        ' 其他专业业务活动收入',
        ' 技术服务类收入'
      ],
      // 其他各项收入合计（6个指定项目）
      otherIncomeTargetProjects: [
        '利息预算收入',
        '租金预算收入',
        '科技成果转化收入',
        '社保返还收入',
        '其他收入',
        '其他收入（离退休费差额）'
      ],
      // 社保返还及相关收入合计（3个指定项目）
      socialRelateIncomeTargetProjects: [
        '其他收入（离退休费差额）',
        '社保返还收入',
        '其他收入'
      ],
      // 新增：总收入预算合计（17个指定项目）
      totalIncomeTargetProjects: [
        '上年结转',
        ' 在职',
        ' 离退休',
        ' 日常公用经费',
        ' 技术服务类收入',
        ' 其他专业业务活动收入',
        ' 科技副产品收入',
        ' 其他辅助活动收入',
        ' 其他业务收入',
        '利息预算收入',
        '租金预算收入',
        '科技成果转化收入',
        '社保返还收入',
        '其他收入',
        '其他收入（离退休费差额）',
        '使用非财政拨款结余'
      ],
      // 金额字段（实际金额、预算金额）
      amountFields: ['cwSj', 'cwYs'],
      columns: [
        {
          title: '项目',
          align: 'center',
          dataIndex: 'project'
        },
        {
          title: '', // 动态赋值，初始为空
          align: 'center',
          dataIndex: 'cwSj',
          customRender: (text) => this.formatNumber(text)
        },
        {
          title: '', // 动态赋值，初始为空
          align: 'center',
          dataIndex: 'cwYs',
          customRender: (text) => this.formatNumber(text)
        },
        {
          title: '差额', // 动态赋值，初始为空
          align: 'center',
          dataIndex: 'ce',
          customRender: (text) => this.formatNumber(text)
        },
        {
          title: '测算依据（可另加附页）',
          align: 'center',
          dataIndex: 'csyj',
        },
      ],
      url: {
        listByMainId: '/cw/cwJbsrysTj/queryCwJbsrysByMainId',
      },
    }
  },
  computed: {
    // 带八条合计行的完整数据（含新增总收入预算合计）
    tableDataWithTotal() {
      if (!this.dataSource || this.dataSource.length === 0) return []

      // 深拷贝原始数据，避免污染原数据
      const newData = JSON.parse(JSON.stringify(this.dataSource))
      // 计算八条合计数据
      const personTotal = this.calcPersonTotal() // 在职+离退休（分项合计）
      const totalSum = this.calcTotalSum() // 在职+离退休+日常公用经费（总合计）
      const serviceBizTotal = this.calcServiceBizTotal() // 专业业务活动收入
      const assistBizTotal = this.calcAssistBizTotal() // 辅助活动收入
      const allBizTotal = this.calcAllBizTotal() // 全业务收入合计
      const otherIncomeTotal = this.calcOtherIncomeTotal() // 其他各项收入合计
      const socialRelateIncomeTotal = this.calcSocialRelateIncomeTotal() // 社保返还及相关收入合计
      const totalIncomeTotal = this.calcTotalIncomeTotal() // 新增总收入预算合计

      // 1. 构建（一）人员经费合计行
      const personTotalRow = {
        id: 'person_total_' + new Date().getTime(),
        project: '  （一）人员经费',
        cwSj: personTotal.cwSj,
        cwYs: personTotal.cwYs,
        csyj: '',
        ce:personTotal.cwSj-personTotal.cwYs
      }

      // 2. 构建二、财政拨款预算收入合计行
      const totalSumRow = {
        id: 'total_sum_' + new Date().getTime(),
        project: '  二、财政拨款预算收入',
        cwSj: totalSum.cwSj,
        cwYs: totalSum.cwYs,
        csyj: '',
        ce:totalSum.cwSj-totalSum.cwYs
      }

      // 3. 构建（一）专业业务活动收入合计行
      const serviceBizTotalRow = {
        id: 'service_biz_total_' + new Date().getTime(),
        project: '  （一）专业业务活动收入',
        cwSj: serviceBizTotal.cwSj,
        cwYs: serviceBizTotal.cwYs,
        csyj: '',
        ce:serviceBizTotal.cwSj-serviceBizTotal.cwYs
      }

      // 4. 构建（二）辅助活动收入合计行
      const assistBizTotalRow = {
        id: 'assist_biz_total_' + new Date().getTime(),
        project: '  （二）辅助活动收入',
        cwSj: assistBizTotal.cwSj,
        cwYs: assistBizTotal.cwYs,
        csyj: '',
        ce:assistBizTotal.cwSj-assistBizTotal.cwYs
      }

      // 5. 构建三、事业收入合计行
      const allBizTotalRow = {
        id: 'all_biz_total_' + new Date().getTime(),
        project: '  三、事业收入合计',
        cwSj: allBizTotal.cwSj,
        cwYs: allBizTotal.cwYs,
        csyj: '',
        ce:allBizTotal.cwSj-allBizTotal.cwYs
      }

      // 6. 构建四、其他预算收入合计行
      const otherIncomeTotalRow = {
        id: 'other_income_total_' + new Date().getTime(),
        project: '  四、其他预算收入',
        cwSj: otherIncomeTotal.cwSj,
        cwYs: otherIncomeTotal.cwYs,
        csyj: '',
        ce:otherIncomeTotal.cwSj-otherIncomeTotal.cwYs
      }

      // 7. 构建（四）其他收入合计行
      const socialRelateIncomeTotalRow = {
        id: 'social_relate_income_total_' + new Date().getTime(),
        project: '  （四）其他收入',
        cwSj: socialRelateIncomeTotal.cwSj,
        cwYs: socialRelateIncomeTotal.cwYs,
        csyj: '',
        ce:socialRelateIncomeTotal.cwSj-socialRelateIncomeTotal.cwYs
      }

      // 8. 构建一、总收入预算合计行（新增）
      const totalIncomeTotalRow = {
        id: 'total_income_total_' + new Date().getTime(), // 独立ID避免重复
        project: '  一、总收入预算合计',
        cwSj: totalIncomeTotal.cwSj,
        cwYs: totalIncomeTotal.cwYs,
        csyj: '',
        ce:totalIncomeTotal.cwSj-totalIncomeTotal.cwYs
      }

      // 第一部分：插入总收入预算合计行（核心：上年结转上一条）
      const carryForwardIndex = newData.findIndex(item => item.project === '上年结转')
      if (carryForwardIndex !== -1) {
        newData.splice(carryForwardIndex, 0, totalIncomeTotalRow)
      } else {
        // 兼容：未找到"上年结转"时，插入到表格最前面
        newData.unshift(totalIncomeTotalRow)
      }

      // 第二部分：插入财政拨款相关合计行（原有逻辑保留）
      const personFundsIndex = newData.findIndex(item => item.project === '（一）人员经费')
      if (personFundsIndex !== -1) {
        newData.splice(personFundsIndex, 0, personTotalRow)
        newData.splice(personFundsIndex, 0, totalSumRow)
      } else {
        const zaiZhiIndex = newData.findIndex(item => item.project === ' 在职')
        if (zaiZhiIndex !== -1) {
          newData.splice(zaiZhiIndex, 0, personTotalRow)
          newData.splice(zaiZhiIndex, 0, totalSumRow)
        } else {
          newData.push(totalSumRow)
          newData.push(personTotalRow)
        }
      }

      // 第三部分：插入专业业务活动收入合计行（技术服务类收入前）
      const techServiceIndex = newData.findIndex(item => item.project === ' 技术服务类收入')
      if (techServiceIndex !== -1) {
        newData.splice(techServiceIndex, 0, serviceBizTotalRow)
      } else {
        newData.push(serviceBizTotalRow)
      }

      // 第四部分：插入辅助活动收入合计行（科技副产品收入前）
      const techProductIndex = newData.findIndex(item => item.project === ' 科技副产品收入')
      if (techProductIndex !== -1) {
        newData.splice(techProductIndex, 0, assistBizTotalRow)
      } else {
        newData.push(assistBizTotalRow)
      }

      // 第五部分：插入事业收入合计行（所有业务类项目最前面）
      if (techServiceIndex !== -1) {
        newData.splice(techServiceIndex, 0, allBizTotalRow)
      } else if (techProductIndex !== -1) {
        newData.splice(techProductIndex, 0, allBizTotalRow)
      } else {
        const firstBizTotalIndex = newData.findIndex(item =>
          item.project.includes('（一）专业业务活动收入') ||
          item.project.includes('（二）辅助活动收入')
        )
        if (firstBizTotalIndex !== -1) {
          newData.splice(firstBizTotalIndex, 0, allBizTotalRow)
        } else {
          newData.push(allBizTotalRow)
        }
      }

      // 第六部分：插入其他预算收入合计行（利息预算收入上一条）
      const interestIncomeIndex = newData.findIndex(item => item.project === '利息预算收入')
      if (interestIncomeIndex !== -1) {
        newData.splice(interestIncomeIndex, 0, otherIncomeTotalRow)
      } else {
        const firstOtherIncomeIndex = newData.findIndex(item =>
          this.otherIncomeTargetProjects.includes(item.project)
        )
        if (firstOtherIncomeIndex !== -1) {
          newData.splice(firstOtherIncomeIndex, 0, otherIncomeTotalRow)
        } else {
          newData.push(otherIncomeTotalRow)
        }
      }

      // 第七部分：插入（四）其他收入合计行（社保返还收入上一条）
      const socialIncomeIndex = newData.findIndex(item => item.project === '社保返还收入')
      if (socialIncomeIndex !== -1) {
        newData.splice(socialIncomeIndex, 0, socialRelateIncomeTotalRow)
      } else {
        const firstSocialRelateIndex = newData.findIndex(item =>
          this.socialRelateIncomeTargetProjects.includes(item.project)
        )
        if (firstSocialRelateIndex !== -1) {
          newData.splice(firstSocialRelateIndex, 0, socialRelateIncomeTotalRow)
        } else {
          const otherIncomeRowIndex = newData.findIndex(item => item.project === '  四、其他预算收入')
          if (otherIncomeRowIndex !== -1) {
            newData.splice(otherIncomeRowIndex + 1, 0, socialRelateIncomeTotalRow)
          } else {
            newData.push(socialRelateIncomeTotalRow)
          }
        }
      }

      return newData
    }
  },
  watch: {
    record: {
      immediate: true,
      handler() {
        if (!this.record) return;

        // 提取年份文本（兼容纯数字和带后缀格式）
        const yearText = this.record.year_dictText || this.record.year || '';
        // 强制提取所有数字（如"2026年一上"→"2026"）
        const pureYearStr = yearText.toString().replace(/[^\d]/g, '');
        // 转成有效数字
        const currentYearNum = pureYearStr ? Number(pureYearStr) : null;

        // 赋值当前年份和次年
        this.currentYear = currentYearNum ? `${currentYearNum}年` : yearText;
        this.nextYear = currentYearNum ? `${currentYearNum + 1}年` : '次年';

        // 强制更新列标题（解决Vue响应式缓存问题）
        this.$set(this.columns, 1, { ...this.columns[1], title: `预计${this.currentYear}实际` });
        this.$set(this.columns, 2, { ...this.columns[2], title: `${this.nextYear}预算` });

        // 加载子表数据
        this.loadData(this.record);
      }
    }
  },
  methods: {
    loadData(record) {
      this.loading = true;
      this.dataSource = [];
      getAction(this.url.listByMainId, {
        id: record.id
      }).then((res) => {
        if (res.success) {
          this.dataSource = res.result.records || []; // 兼容无数据场景
        }
      }).finally(() => {
        this.loading = false;
      });
    },

    /**
     * 数字格式化（金额保留2位小数）
     */
    formatNumber(text) {
      const num = Number(text);
      return isNaN(num) ? '0.00' : num.toFixed(2);
    },

    /**
     * 分项合计：计算在职+离退休的金额总和
     */
    calcPersonTotal() {
      const totals = this.amountFields.reduce((obj, field) => {
        obj[field] = 0;
        return obj;
      }, {});

      this.dataSource.forEach(item => {
        if (this.personTargetProjects.includes(item.project)) {
          this.amountFields.forEach(field => {
            const val = Number(item[field]);
            totals[field] += isNaN(val) ? 0 : val;
          });
        }
      });

      this.amountFields.forEach(field => {
        totals[field] = totals[field].toFixed(2);
      });

      return totals;
    },

    /**
     * 总合计：计算在职+离退休+日常公用经费的金额总和
     */
    calcTotalSum() {
      const totals = this.amountFields.reduce((obj, field) => {
        obj[field] = 0;
        return obj;
      }, {});

      this.dataSource.forEach(item => {
        if (this.totalTargetProjects.includes(item.project)) {
          this.amountFields.forEach(field => {
            const val = Number(item[field]);
            totals[field] += isNaN(val) ? 0 : val;
          });
        }
      });

      this.amountFields.forEach(field => {
        totals[field] = totals[field].toFixed(2);
      });

      return totals;
    },

    /**
     * 专业业务活动收入：计算技术服务类收入+其他专业业务活动收入的金额总和
     */
    calcServiceBizTotal() {
      const totals = this.amountFields.reduce((obj, field) => {
        obj[field] = 0;
        return obj;
      }, {});

      this.dataSource.forEach(item => {
        if (this.serviceBizTargetProjects.includes(item.project)) {
          this.amountFields.forEach(field => {
            const val = Number(item[field]);
            totals[field] += isNaN(val) ? 0 : val;
          });
        }
      });

      this.amountFields.forEach(field => {
        totals[field] = totals[field].toFixed(2);
      });

      return totals;
    },

    /**
     * 辅助活动收入：计算科技副产品收入+其他辅助活动收入的金额总和
     */
    calcAssistBizTotal() {
      const totals = this.amountFields.reduce((obj, field) => {
        obj[field] = 0;
        return obj;
      }, {});

      this.dataSource.forEach(item => {
        if (this.assistBizTargetProjects.includes(item.project)) {
          this.amountFields.forEach(field => {
            const val = Number(item[field]);
            totals[field] += isNaN(val) ? 0 : val;
          });
        }
      });

      this.amountFields.forEach(field => {
        totals[field] = totals[field].toFixed(2);
      });

      return totals;
    },

    /**
     * 全业务收入合计（5个指定项目的金额总和）
     */
    calcAllBizTotal() {
      const totals = this.amountFields.reduce((obj, field) => {
        obj[field] = 0;
        return obj;
      }, {});

      this.dataSource.forEach(item => {
        if (this.allBizTargetProjects.includes(item.project)) {
          this.amountFields.forEach(field => {
            const val = Number(item[field]);
            totals[field] += isNaN(val) ? 0 : val;
          });
        }
      });

      this.amountFields.forEach(field => {
        totals[field] = totals[field].toFixed(2);
      });

      return totals;
    },

    /**
     * 其他各项收入合计（6个指定项目的金额总和）
     */
    calcOtherIncomeTotal() {
      const totals = this.amountFields.reduce((obj, field) => {
        obj[field] = 0;
        return obj;
      }, {});

      this.dataSource.forEach(item => {
        if (this.otherIncomeTargetProjects.includes(item.project)) {
          this.amountFields.forEach(field => {
            const val = Number(item[field]);
            totals[field] += isNaN(val) ? 0 : val;
          });
        }
      });

      this.amountFields.forEach(field => {
        totals[field] = totals[field].toFixed(2);
      });

      return totals;
    },

    /**
     * 社保返还及相关收入合计（3个指定项目的金额总和）
     */
    calcSocialRelateIncomeTotal() {
      const totals = this.amountFields.reduce((obj, field) => {
        obj[field] = 0;
        return obj;
      }, {});

      this.dataSource.forEach(item => {
        if (this.socialRelateIncomeTargetProjects.includes(item.project)) {
          this.amountFields.forEach(field => {
            const val = Number(item[field]);
            totals[field] += isNaN(val) ? 0 : val;
          });
        }
      });

      this.amountFields.forEach(field => {
        totals[field] = totals[field].toFixed(2);
      });

      return totals;
    },

    /**
     * 新增：总收入预算合计（17个指定项目的金额总和）
     */
    calcTotalIncomeTotal() {
      const totals = this.amountFields.reduce((obj, field) => {
        obj[field] = 0;
        return obj;
      }, {});

      this.dataSource.forEach(item => {
        // 统计17个指定项目的金额
        if (this.totalIncomeTargetProjects.includes(item.project)) {
          this.amountFields.forEach(field => {
            const val = Number(item[field]);
            totals[field] += isNaN(val) ? 0 : val;
          });
        }
      });

      // 格式化合计结果（保留2位小数）
      this.amountFields.forEach(field => {
        totals[field] = totals[field].toFixed(2);
      });

      return totals;
    },

    // 空实现方法，避免报错
    downloadFile(text) {
    },
    getImgView(text) {
      return text;
    }
  },
}
</script>

<style scoped>
/* 一、总收入预算合计行样式（金色系，突出总览层级） */
::v-deep .ant-table-tbody tr .ant-table-cell:has(div:contains('一、总收入预算合计')) {
  background-color: #fefce8 !important;
  font-weight: 700 !important;
  border-top: 2px solid #f59e0b !important;
  color: #92400e !important;
  text-align: center !important;
  white-space: nowrap !important;
}

/* 总合计行样式（蓝色系，突出层级） */
::v-deep .ant-table-tbody tr .ant-table-cell:has(div:contains('二、财政拨款预算收入')) {
  background-color: #e8f4f8 !important;
  font-weight: 700 !important;
  border-top: 2px solid #4299e1 !important;
  color: #2563eb !important;
  text-align: center !important;
  white-space: nowrap !important;
}

/* （一）人员经费合计行样式（浅蓝色系） */
::v-deep .ant-table-tbody tr .ant-table-cell:has(div:contains('（一）人员经费')) {
  background-color: #f0f8fb !important;
  font-weight: 600 !important;
  border-top: 1px solid #94a3b8 !important;
  color: #334155 !important;
  text-align: center !important;
  white-space: nowrap !important;
}

/* （一）专业业务活动收入合计行样式（绿色系） */
::v-deep .ant-table-tbody tr .ant-table-cell:has(div:contains('（一）专业业务活动收入')) {
  background-color: #f0fdf4 !important;
  font-weight: 600 !important;
  border-top: 2px solid #10b981 !important;
  color: #059669 !important;
  text-align: center !important;
  white-space: nowrap !important;
}

/* （二）辅助活动收入合计行样式（橙色系） */
::v-deep .ant-table-tbody tr .ant-table-cell:has(div:contains('（二）辅助活动收入')) {
  background-color: #fff7ed !important;
  font-weight: 600 !important;
  border-top: 2px solid #f97316 !important;
  color: #c2410c !important;
  text-align: center !important;
  white-space: nowrap !important;
}

/* 三、事业收入合计行样式（紫色系） */
::v-deep .ant-table-tbody tr .ant-table-cell:has(div:contains('三、事业收入合计')) {
  background-color: #f5f3ff !important;
  font-weight: 600 !important;
  border-top: 2px solid #8b5cf6 !important;
  color: #6d28d9 !important;
  text-align: center !important;
  white-space: nowrap !important;
}

/* 四、其他预算收入合计行样式（红色系） */
::v-deep .ant-table-tbody tr .ant-table-cell:has(div:contains('四、其他预算收入')) {
  background-color: #fee2e2 !important;
  font-weight: 600 !important;
  border-top: 2px solid #ef4444 !important;
  color: #b91c1c !important;
  text-align: center !important;
  white-space: nowrap !important;
}

/* （四）其他收入合计行样式（青色系） */
::v-deep .ant-table-tbody tr .ant-table-cell:has(div:contains('（四）其他收入')) {
  background-color: #e0f2fe !important;
  font-weight: 600 !important;
  border-top: 2px solid #06b6d4 !important;
  color: #0891b2 !important;
  text-align: center !important;
  white-space: nowrap !important;
}

/* 表格基础样式优化 */
::v-deep .ant-table-wrapper {
  overflow-x: auto !important;
  min-width: 900px !important;
}

::v-deep .ant-table-column-title {
  white-space: nowrap !important;
  font-size: 12px !important;
  padding: 8px 6px !important;
}

::v-deep .ant-table-tbody td {
  white-space: nowrap !important;
  font-size: 12px !important;
  padding: 8px 6px !important;
}

::v-deep .ant-table-thead th {
  white-space: nowrap !important;
}
</style>